package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatPrivateSession;
import com.zenithmind.chat.pojo.vo.ChatPrivateSessionVO;
import com.zenithmind.common.result.PageResult;

import java.util.List;

/**
 * 私聊会话服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatPrivateSessionService extends IService<ChatPrivateSession> {

    /**
     * 分页查询用户会话列表
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 会话列表
     */
    PageResult<ChatPrivateSessionVO> getUserSessionPage(String userId, Integer pageNum, Integer pageSize);

    /**
     * 查询用户会话列表
     * 
     * @param userId 用户ID
     * @return 会话列表
     */
    List<ChatPrivateSessionVO> getUserSessions(String userId);

    /**
     * 根据用户ID查询会话
     * 
     * @param user1Id 用户1ID
     * @param user2Id 用户2ID
     * @return 会话信息
     */
    ChatPrivateSessionVO getSessionByUserIds(String user1Id, String user2Id);

    /**
     * 创建或获取会话
     * 
     * @param user1Id 用户1ID
     * @param user2Id 用户2ID
     * @return 会话ID
     */
    String createOrGetSession(String user1Id, String user2Id);

    /**
     * 更新会话最后消息信息
     *
     * @param sessionId 会话ID
     * @param messageId 消息ID
     * @return 更新结果
     */
    Boolean updateLastMessage(String sessionId, String messageId);

    /**
     * 更新用户未读数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param increment 增量（正数增加，负数减少）
     * @return 更新结果
     */
    Boolean updateUserUnreadCount(String sessionId, String userId, Integer increment);

    /**
     * 清零用户未读数
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 更新结果
     */
    Boolean clearUserUnreadCount(String sessionId, String userId);

    /**
     * 设置会话置顶
     *
     * @param sessionId 会话ID
     * @param isTop 是否置顶
     * @param userId 用户ID
     * @return 设置结果
     */
    Boolean setSessionTop(String sessionId, Boolean isTop, String userId);

    /**
     * 设置会话免打扰
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param isDisturbFree 是否免打扰
     * @return 设置结果
     */
    Boolean setSessionDisturbFree(String sessionId, String userId, Boolean isDisturbFree);

    /**
     * 删除会话（用户视角）
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean deleteSession(String sessionId, String userId);

    /**
     * 恢复会话（用户视角）
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 恢复结果
     */
    Boolean restoreSession(String sessionId, String userId);

    /**
     * 保存草稿
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @param draftContent 草稿内容
     * @return 保存结果
     */
    Boolean saveDraft(String sessionId, String userId, String draftContent);

    /**
     * 清除草稿
     * 
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 清除结果
     */
    Boolean clearDraft(String sessionId, String userId);

    /**
     * 统计用户会话数量
     * 
     * @param userId 用户ID
     * @return 会话数量
     */
    Integer countUserSessions(String userId);

    /**
     * 获取用户总未读数
     * 
     * @param userId 用户ID
     * @return 总未读数
     */
    Integer getTotalUnreadCount(String userId);

    /**
     * 清理无效会话（双方都删除的会话）
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Integer cleanInvalidSessions(Integer days);

    /**
     * 获取会话统计信息
     *
     * @param userId 用户ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 统计信息
     */
    Object getSessionStatistics(String userId, String startTime, String endTime);

    /**
     * 获取会话统计信息（简化版）
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    Object getSessionStatistics(String userId);

    /**
     * 创建会话
     *
     * @param userId 用户ID
     * @param targetUserId 目标用户ID
     * @return 会话ID
     */
    String createSession(String userId, String targetUserId);

    /**
     * 根据会话ID获取会话信息
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 会话信息
     */
    ChatPrivateSessionVO getSessionById(String sessionId, String userId);

    /**
     * 获取与指定用户的会话
     *
     * @param userId 用户ID
     * @param targetUserId 目标用户ID
     * @return 会话信息
     */
    ChatPrivateSessionVO getSessionWithUser(String userId, String targetUserId);

    /**
     * 设置会话静音
     *
     * @param sessionId 会话ID
     * @param isMuted 是否静音
     * @param userId 用户ID
     * @return 设置结果
     */
    Boolean setSessionMute(String sessionId, Boolean isMuted, String userId);

    /**
     * 清除未读数
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 清除结果
     */
    Boolean clearUnreadCount(String sessionId, String userId);

    /**
     * 获取未读数
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 未读数
     */
    Integer getUnreadCount(String sessionId, String userId);

    /**
     * 获取活跃会话列表
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 活跃会话列表
     */
    List<ChatPrivateSessionVO> getActiveSessions(String userId, Integer limit);

    /**
     * 获取置顶会话列表
     *
     * @param userId 用户ID
     * @return 置顶会话列表
     */
    List<ChatPrivateSessionVO> getTopSessions(String userId);

    /**
     * 搜索会话
     *
     * @param userId 用户ID
     * @param keyword 关键词
     * @return 搜索结果
     */
    List<ChatPrivateSessionVO> searchSessions(String userId, String keyword);

    /**
     * 批量删除会话
     *
     * @param sessionIds 会话ID列表
     * @param userId 用户ID
     * @return 删除结果
     */
    Boolean batchDeleteSessions(List<String> sessionIds, String userId);

    /**
     * 批量清除未读数
     *
     * @param sessionIds 会话ID列表
     * @param userId 用户ID
     * @return 清除结果
     */
    Boolean batchClearUnreadCount(List<String> sessionIds, String userId);

    /**
     * 归档会话
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 归档结果
     */
    Boolean archiveSession(String sessionId, String userId);

    /**
     * 取消归档会话
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 取消归档结果
     */
    Boolean unarchiveSession(String sessionId, String userId);

    /**
     * 获取已归档会话列表
     *
     * @param userId 用户ID
     * @return 已归档会话列表
     */
    List<ChatPrivateSessionVO> getArchivedSessions(String userId);
}
